#include "keyDedect.h"
#include "main.h"

// 按键状态枚举（状态机管理）
typedef enum {
    KEY_IDLE,              // 空闲状态
    KEY_PRESS_DEBOUNCE,    // 按下防抖中
    KEY_PRESSED,           // 已按下状态（仅触发一次）
    KEY_RELEASE_DEBOUNCE   // 释放防抖中
} KeyStateTypeDef;

uint8_t Keypad_Scan(void) {
    static KeyStateTypeDef key_state = KEY_IDLE;
    static uint32_t debounce_start_time = 0;
    uint32_t current_time = HAL_GetTick();

    switch (key_state) {
        case KEY_IDLE:
            // 检测到按键按下（低电平），进入按下防抖
            if (HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_RESET) {
                key_state = KEY_PRESS_DEBOUNCE;
                debounce_start_time = current_time;
            }
            break;

        case KEY_PRESS_DEBOUNCE:
            // 按下防抖（30ms，比20ms更稳定）
            if (current_time - debounce_start_time >= 30) {
                if (HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_RESET) {
                    key_state = KEY_PRESSED;  // 确认按下，进入已按下状态
                    return 1;  // 仅返回1次有效按下
                } else {
                    key_state = KEY_IDLE;  // 误触发，回到空闲
                }
            }
            break;

        case KEY_PRESSED:
            // 等待按键释放（高电平），进入释放防抖
            if (HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_SET) {
                key_state = KEY_RELEASE_DEBOUNCE;
                debounce_start_time = current_time;
            }
            break;

        case KEY_RELEASE_DEBOUNCE:
            // 释放防抖（30ms），确保完全释放
            if (current_time - debounce_start_time >= 30) {
                key_state = KEY_IDLE;  // 回到空闲，允许下次检测
            }
            break;

        default:
            key_state = KEY_IDLE;
            break;
    }
    return 0;
}

void Keypad_Init(void) {
    // 确保GPIO已配置（CubeMX生成的MX_GPIO_Init会初始化按键引脚）
}
